package avaliacao.DAO;

import avaliacao.Constantes;
import avaliacao.DTO.DTOAvaliador;
import avaliacao.Exception.MailException;
import avaliacao.MailUtil;
import avaliacao.Util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;

public class DAOAvaliador extends DAO{

    static final String TB_AVALIADOR = "avaliador";
    static final String TB_AVALIADOR_LOGIN = "login";
    static final String TB_AVALIADOR_SENHA = "senha";
    static final String TB_AVALIADOR_ID = "id_avaliador";
    static final String TB_AVALIADOR_NOME = "nome_avaliador";
    static final String TB_AVALIADOR_EMAIL = "email";
    static final String TB_AVALIADOR_ID_GRUPO = "id_grupo";

    static final String TB_GRUPO = "grupo";
    static final String TB_GRUPO_ID = "id_grupo";
    static final String TB_GRUPO_NOME = "nome";

    public void getAvaliadorInfo(DTOAvaliador avaliador) {
        PreparedStatement pst;
        ResultSet rs;
        
        try {
            Connection con = getConnection();

            pst = con.prepareStatement("SELECT * FROM "+ TB_AVALIADOR +
                                        " INNER JOIN "+ TB_GRUPO +
                                        " ON "+ TB_GRUPO + "." + TB_GRUPO_ID +
                                        " = " + TB_AVALIADOR +"." +
                                        TB_AVALIADOR_ID_GRUPO + " WHERE "+
                                        TB_AVALIADOR_LOGIN +" = ? AND " +
                                        TB_AVALIADOR_SENHA + " = ?");

            pst.setString(1, avaliador.getLogin());
            pst.setString(2, Util.encriptaSenha(avaliador.getSenha()));

            rs = pst.executeQuery();

            if(rs.next())
            {
                avaliador.setLogin(rs.getString(TB_AVALIADOR_LOGIN));
                avaliador.setSenha(rs.getString(TB_AVALIADOR_SENHA));
                avaliador.setID(rs.getInt(TB_AVALIADOR_ID));
                avaliador.setNome(rs.getString(TB_AVALIADOR_NOME));
                avaliador.setEmail(rs.getString(TB_AVALIADOR_EMAIL));
                avaliador.setGrupo(rs.getString(TB_GRUPO_NOME));
            }

            con.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    public boolean existeLogin(String login){
        boolean existe = true;
        PreparedStatement pst;
        ResultSet rs;

        try {
            Connection con = getConnection();

            pst = con.prepareStatement("SELECT * FROM "+ TB_AVALIADOR +
                                        " WHERE "+
                                        TB_AVALIADOR_LOGIN +" = ?");

            pst.setString(1, login);

            rs = pst.executeQuery();

            if(!rs.next())
                existe = false;
            
            con.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return existe; //true - se o login jah existir; false se o login nao existir
    }

    public boolean cadastrarAvaliador (DTOAvaliador avaliador){

        boolean sucesso = false;
        PreparedStatement pst;
        String novaSenha = Util.geraSenha();
        avaliador.setSenha(novaSenha);

        try {
            Connection con = getConnection();

            pst = con.prepareStatement("INSERT INTO "+ TB_AVALIADOR +
                                        " ("+TB_AVALIADOR_LOGIN
                                        +","+TB_AVALIADOR_SENHA
                                        +","+TB_AVALIADOR_NOME
                                        +","+TB_AVALIADOR_EMAIL
                                        +","+TB_AVALIADOR_ID_GRUPO
                                        +") VALUES(?,?,?,?,(SELECT "+TB_GRUPO_ID+
                                        " FROM "+ TB_GRUPO + " WHERE nome = ?)) ");

            pst.setString(1, avaliador.getLogin());
            pst.setString(2, Util.encriptaSenha(novaSenha));
            pst.setString(3, avaliador.getNome());
            pst.setString(4, avaliador.getEmail());
            pst.setString(5, avaliador.getGrupo());


           pst.executeUpdate();

           this.getAvaliadorInfo(avaliador);

            if(avaliador.getID() != -1)
            {
                sucesso = true;
               
                String assunto = Constantes.MEC_ASSUNTO_EMAIL_NOVO_CADASTRO;
                String body = "Prezado(a) "+avaliador.getNome()+",<br> "+
                        "Seu cadastro foi efetuado com sucesso. Seguem os dados:<br>"+
                        "Nome: "+avaliador.getNome()+"<br>"+
                        "Login: "+avaliador.getLogin()+"<br>"+
                        "Senha: "+ novaSenha+"<br><br>"+
                        "Grato,<br> Sistema MEC";
                MailUtil.getInstance().send(assunto,avaliador.getEmail(), body);
            }
           //TODO: sucesso, erro apenas no envio do e-mail ... discriminar este erro
            else
                return false;

           con.close();
           return sucesso;
        }
        catch (MailException ex) {
            ex.printStackTrace();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    public boolean trocaSenha(DTOAvaliador avaliador, String senhaNova) {
        boolean sucesso = false;
        PreparedStatement pst;

        try {
            Connection con = getConnection();

            pst = con.prepareStatement("UPDATE "+ TB_AVALIADOR +
                                        " SET "+TB_AVALIADOR_SENHA
                                        +" = ? WHERE "+TB_AVALIADOR_LOGIN
                                        +" = ?");

            pst.setString(1, Util.encriptaSenha(senhaNova));
            pst.setString(2, avaliador.getLogin());

            pst.executeUpdate();
            
            avaliador.setSenha(Util.encriptaSenha(senhaNova));
            sucesso = true;
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return sucesso;
    }

    public boolean getAvaliadorByID(DTOAvaliador avaliador) {
        boolean sucesso = false;
        PreparedStatement pst;
        ResultSet rs;

        try {
            Connection con = getConnection();

            pst = con.prepareStatement("SELECT * FROM "+ TB_AVALIADOR +
                                        " INNER JOIN "+ TB_GRUPO +
                                        " ON "+ TB_GRUPO + "." + TB_GRUPO_ID +
                                        " = " + TB_AVALIADOR +"." +
                                        TB_AVALIADOR_ID_GRUPO +" WHERE "+TB_AVALIADOR_ID
                                        +" = ?");
            pst.setInt(1, avaliador.getID());

            rs = pst.executeQuery();

            if(rs.next())
            {
                avaliador.setLogin(rs.getString(TB_AVALIADOR_LOGIN));
                avaliador.setSenha(rs.getString(TB_AVALIADOR_SENHA));
                avaliador.setID(rs.getInt(TB_AVALIADOR_ID));
                avaliador.setNome(rs.getString(TB_AVALIADOR_NOME));
                avaliador.setEmail(rs.getString(TB_AVALIADOR_EMAIL));
                avaliador.setGrupo(rs.getString(TB_GRUPO_NOME));
                sucesso = true;
            }

        }catch(Exception e){
            e.printStackTrace();
        }
        return sucesso;
    }

     public boolean getAvaliadorByLogin(DTOAvaliador avaliador) {
        boolean sucesso = false;
        PreparedStatement pst;
        ResultSet rs;

        try {
            Connection con = getConnection();

            pst = con.prepareStatement("SELECT * FROM "+ TB_AVALIADOR +
                                        " INNER JOIN "+ TB_GRUPO +
                                        " ON "+ TB_GRUPO + "." + TB_GRUPO_ID +
                                        " = " + TB_AVALIADOR +"." +
                                        TB_AVALIADOR_ID_GRUPO +" WHERE "+TB_AVALIADOR_LOGIN
                                        +" = ?");
            pst.setString(1, avaliador.getLogin());

            rs = pst.executeQuery();

            if(rs.next())
            {
                avaliador.setLogin(rs.getString(TB_AVALIADOR_LOGIN));
                avaliador.setSenha(rs.getString(TB_AVALIADOR_SENHA));
                avaliador.setID(rs.getInt(TB_AVALIADOR_ID));
                avaliador.setNome(rs.getString(TB_AVALIADOR_NOME));
                avaliador.setEmail(rs.getString(TB_AVALIADOR_EMAIL));
                avaliador.setGrupo(rs.getString(TB_GRUPO_NOME));
                sucesso = true;
            }

        }catch(Exception e){
            e.printStackTrace();
        }
        return sucesso;
    }

    public boolean atualizarAvaliador(DTOAvaliador avaliador) {
        boolean sucesso = false;
        PreparedStatement pst;

        try {
            Connection con = getConnection();

            String sql = "UPDATE "+ TB_AVALIADOR +
                                        " SET "+TB_AVALIADOR_NOME
                                        +" = ?,"+TB_AVALIADOR_EMAIL
                                        +" = ?";
            if(!avaliador.getGrupo().equals(""))
                sql+=","+TB_AVALIADOR_ID_GRUPO+" = (SELECT "+TB_GRUPO_ID+
                                        " FROM "+ TB_GRUPO + " WHERE nome = ?)";
            sql+=" WHERE "+TB_AVALIADOR_LOGIN+" = ?";

            pst = con.prepareStatement(sql);

            pst.setString(1, avaliador.getNome());
            pst.setString(2, avaliador.getEmail());
            if(!avaliador.getGrupo().equals(""))
            {
                pst.setString(3, avaliador.getGrupo());
                pst.setString(4, avaliador.getLogin());
            }
            else
                pst.setString(3, avaliador.getLogin());

           pst.executeUpdate();

           this.getAvaliadorByLogin(avaliador);

            if(avaliador.getID() != -1)
                sucesso = true;
           
            con.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return sucesso;
    }

    public Vector getAvaliadores() {
        PreparedStatement pst;
        ResultSet rs;
        Vector avaliadores = new Vector();
        DTOAvaliador avaliador;

        try {
            Connection con = getConnection();

            pst = con.prepareStatement("SELECT * FROM "+ TB_AVALIADOR +
                                        " ORDER BY "+ TB_AVALIADOR_NOME);

            rs = pst.executeQuery();

            while(rs.next())
            {
                avaliador = new DTOAvaliador();
                avaliador.setNome(rs.getString(TB_AVALIADOR_NOME));
                avaliador.setLogin(rs.getString(TB_AVALIADOR_LOGIN));
                avaliador.setSenha(rs.getString(TB_AVALIADOR_SENHA));
                avaliador.setEmail(rs.getString(TB_AVALIADOR_EMAIL));
                avaliador.setID(rs.getInt(TB_AVALIADOR_ID));
                avaliadores.add(avaliador);
            }

            con.close();

        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return avaliadores;
    }
}
